package cn.benben.core.utils;

import cn.hutool.core.util.RandomUtil;

import java.security.MessageDigest;

/**
 * @author    : xn
 * @Date      : 2021/8/18 
 * @Desc      :  同科科讯的加密方法
 */
public class MD5Utils {

    private static final String BASE_CHAR_NUMBER_UP = RandomUtil.BASE_CHAR + RandomUtil.BASE_NUMBER + RandomUtil.BASE_CHAR.toUpperCase();

    /**
     * 获取一个随机的 32位的 字母+大写字母+小写字母
     * @param len
     * @return
     */
    public static String getRndKey(int len) {
        return RandomUtil.randomString(BASE_CHAR_NUMBER_UP, len);
    }

    /**
     *
     * @param str 明文密码+盐值(获取一个随机的 32位的 字母+大写字母+小写字母 生成的  盐值)
     * @return 加密密码
     */
    private static String md5(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes());
            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }
                buf.append(Integer.toHexString(i));
            }
            str = buf.toString();
        } catch (Exception e) {
            e.printStackTrace();

        }
        return str;
    }

    /**
     *  生成32位的随机盐
     *
     * @return
     */
    public static String getSalt() {
        return getRndKey(32);
    }

    /**
     *
     * @param rawPassword 真实密码
     * @param salt 随机盐值
     * @param encodedPassword 加密后字符
     * @return 结果
     */
    public static boolean MD5matchesPassword(String rawPassword, String salt, String encodedPassword) {
        String s = md5(rawPassword + salt);
        return encodedPassword.equals(s);
    }

    /**
     * 生成 MD5PasswordEncoder密码
     *
     * @param password 密码
     * @return 加密字符串
     */
    public static String Md5PasswordEncoder(String password, String salt) {
        return md5(password + salt);
    }

    public static void main(String[] args) {
        String salt = getRndKey(32);

        String pwd = md5("668826" + "uCjnvUvYAFktr8jihRB7HW9xJEAu4Dlf");

        System.out.println("pwd = " + pwd);
    }


}
